<!-- 
    js中声明变量的方式：
        var,let,const
        let和const是ecmaScript2015以后引入的
    1.在ECMAScript2015之前只有全局作用域和函数作用域，之后引入let,const关键字，则有块级作用域

    全局作用域：
        使用var在函数外声明,全局声明的变量可以在js任意位置去访问
        例：var x = 1;
            function test(){
                console.log(x);
            }
    函数作用域：
        声明的变量只能在函数块内访问
        
        function test(){
            var y = 1;
        }
        //这里不能访问y
    块作用域：
        {
            var z = 1;
        }
        //这里可以访问z
        这里如果使用let声明变量则不可以访问z
    重新声明变量：
        {
            var x = 1;
        }
        var x = 2;
        使用var会将变量X的值重新赋值，使用let则不会
    循环作用域中：
        如果在循环作用域外面定义了一个i
        循环体中又定义一个i
        在循环完毕之后，如果想再次使用i,i的值就为循环操作结束后的i
        var i = 1;
        for(var i = 0; i < 10;i++){

        }
        console.log(i);
    函数作用域和全局作用域使用var,let声明较为类似
    HTML中全局作用域声明，var声明的可以使用window对象获取，let声明的则不属于window对象

    相同变量名重新声明变量，var都可以，let只能在不同作用域或不同块中重新声明
    相同块或相同作用域中也不可以使用var去重新声明之前let声明过的变量

    变量提升：
        //这里也能使用
        var name = 'a';
        通过let声明的变量不会被提升
    const和let类似
    const用来声明常量，不是真正的常量，可以修改他的属性,声明时就必须赋值
    例如：const x = 0;
    x = 1;//报错
    const car = {name:"ss" ,age:1};
    car.name = "布加迪";//可以使用
    car = {name:"aa",age:2}//报错
    const persons = ['aa','bb','cc'];
    persons[0] = 'dd';//正确
    persons = [1,2];//报错
 -->
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <title>js,let表达</title>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
</head>
<body>
    <script type="text/javascript">
        var name = "aa";
        let age = 19;
        // var x = 1;
        // function test(){
        //     console.log(x);
        // }
        window.onload  = function(){
            // function test(){
            //     var y = 1;
            // }
            // //console.log(y);//报错y is not defined
            // {
            //     var z = 1;
            // }
            // console.log(z);//这里var换成let则报错 z is not defined


            // var i = 1;
            // for(var i = 0; i < 10;i++){

            // }
            // console.log('i='+i);//i=10
            // var j = 1;
            // for(let j = 1; j < 10;j++){

            // }
            // console.log("j="+j);//j=1
            // console.log(window.name);//aa
            // console.log(window.age);//undefinde
            // console.log(carName);//undefined    
            // var carName = '布加迪'
            // console.log(carAge);//报错ReferenceError: Cannot access 'carAge' before initialization
            // let carAge = 10;


            const x = 0;
            //x = 1;//报错
            const car = {name:"ss" ,age:1};
            car.name = "布加迪";//可以使用
            //car = {name:"aa",age:2}//报错
            const persons = ['aa','bb','cc'];
            persons[0] = 'dd';//正确
            //persons = [1,2];//报错
        }
        
    </script>
</body>
</html>